home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / EGAVGA.SWG / 0086_Julia Set.pas < prev    next >
Pascal/Delphi Source File  |  1994-01-27  |  3KB  |  101 lines

  1. program Julia;
  2. {program computes and displays a Julia Set using VGA 256 color graphics in
  3.  mode 13h.  written by Andrew Key and released to the public domain.  not
  4.  guaranteed -- use at own risk (but it has been put through limited tests...)
  5.  }
  6. uses
  7.   Crt;
  8.  
  9. const
  10.   MX = 100;  {horizontal number of pixels}
  11.   MY = 100;  {vertical num. of pixels}
  12.  
  13. type
  14.   Complex = record                           {Data type for complex numbers}
  15.               A,Bi: real;
  16.             end;
  17.   VGAMemType = array[1..200,1..320] of byte; {addressed y,x}
  18.  
  19. var
  20.   Num, C: Complex;
  21.   X,Y,SaveMode,I: integer;
  22.   ch: char;
  23.   VGAMem : VGAMemType Absolute $A000:$0000;  {accesses actual video memory}
  24.  
  25. procedure SetMode(mode: integer); assembler; {sets video card to specified
  26.                                               mode}
  27.   asm
  28.     mov ax,mode
  29.     int $10            {Video interrupt}
  30.   end;
  31.  
  32. function CurrentMode: integer; assembler;    {returns current video mode}
  33.   asm
  34.     mov ax,$0f00
  35.     int $10
  36.     xor ah,ah
  37.   end;
  38.  
  39. procedure SqCplx(var N: complex);  {squares a variable of type Complex)}
  40.   var
  41.     temp: real;
  42.   begin
  43.     temp:= (N.A * N.A) - (N.Bi * N.Bi);
  44.     N.Bi:= 2 * N.A * N.Bi;
  45.     N.A:= temp;
  46.   end;
  47.  
  48. procedure AddCplx(var X: complex; Y: complex);
  49. {Adds two complex variables -- X := X + Y}
  50.   begin
  51.     X.A := X.A + Y.A;
  52.     X.Bi:= X.Bi + Y.Bi;
  53.   end;
  54.  
  55. function SqDist(X: complex): real;
  56. {Computes the square of the distance from the point X to the origin}
  57.   begin
  58.     SqDist := X.A * X.A + X.Bi * X.Bi;
  59.   end;
  60.  
  61. procedure ClrVidScr; {Clears video screen in mode 13h}
  62.   var x,y: integer;
  63.   begin
  64.     for x:=1 to 320 do
  65.       for y:=1 to 200 do
  66.         VGAMem[y,x]:=0;
  67.   end;
  68.  
  69. begin
  70.   {Get values for complex constant}
  71.   ClrScr;
  72.   write('Real part: ');
  73.   readln(C.A);
  74.   write('Imaginary part: ');
  75.   readln(C.Bi);
  76.  
  77.   {set video mode to 320*200*256 VGA and clear screen}
  78.   SaveMode:= CurrentMode;  {save current mode}
  79.   SetMode($13);            {set mode 13h}
  80.   ClrVidScr;
  81.  
  82.   {compute julia set}
  83.   for y:= 0 to (MY-1) do
  84.     for x:= 0 to (MX-1) do
  85.       begin
  86.         Num.A := -2 + x / ( MX / 4);  {compute REAL component}
  87.         Num.Bi:= 2 - y / ( MX / 4);   {compute IMAGINARY component}
  88.         I:=0;                         {reset number of iterations}
  89.         repeat
  90.           SqCplx(Num);                {square the complex number}
  91.           AddCplx(Num,C);             {and add the complex constant}
  92.           Inc(I);
  93.         until ((I>=255) or (SqDist(Num)>4));
  94.         VGAMem[y+1,x+1]:=I;           {plot the point}
  95.       end;
  96.  
  97.   {julia set completed}
  98.   ch:=readkey;                        {wait for a keypress}
  99.   SetMode(SaveMode);                  {return to original mode}
  100. end.
  101.